package middleware

import (
	"app-box/api_error"
	"app-box/config"
	"app-box/models"
	"app-box/tools"
	"errors"

	"github.com/gin-gonic/gin"
)

// 检查登陆状态，允许特定类型的用户请求
func RequireLogin(userTypes models.UserType) gin.HandlerFunc {
	return func(ctx *gin.Context) {
		if tokenValue, exist := ctx.Get("Token"); exist {
			if token, ok := tokenValue.(models.Token); ok && token.TokenType == models.TokenTypeLogin {
				if userTypes.HasType(token.UserType) {
					// 如果通过检测，则直接返回，不做任何处理
					return
				} else {
					panic(api_error.InvalidToken(errors.New("无权访问")))
				}
			}
		}
		if err, ok := ctx.Get("TokenError"); ok && err != nil {
			panic(err)
		}
		panic(api_error.RequireLogin())
	}
}

func ParseToken() gin.HandlerFunc {
	return func(c *gin.Context) {
		tokenStr := c.GetHeader("Authorization")
		if len(tokenStr) > 0 {
			var token models.Token
			tokenService := tools.NewTokenTool(config.Server.TokenSalt)
			if err := tokenService.FormatToken(tokenStr, &token); err != nil {
				c.Set("TokenError", err)
				return
			}
			c.Set("Token", token)
		}
	}
}
